package xuecheng.tool.core.concurrent;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import lombok.extern.slf4j.Slf4j;

/**
 * 线程池工具类
 *
 * @author PengXueCheng
 * @version 1.0.0
 */
@Slf4j
public class ThreadPoolUtils {

    /**
     * 得到异步任务结果
     *
     * @param future
     * @return
     */
    public static <T> T getFutureResult(Future<T> future) {
        if (future == null) {
            return null;
        }
        T t = null;
        try {
            t = future.get();
        } catch (InterruptedException | ExecutionException e) {
            log.error(e.getMessage(), e);
            // cancel(false) 与 cancel(true）的区别在于，cancel(false) 只 取消已经提交但还没有被运行的任务（即任务就不会被安排运行）；而 cancel(true)
            // 会取消所有已经提交的任务，包括 正在等待的 和 正在运行的 任务。
            future.cancel(true);
        }
        return t;
    }

    /**
     * 得到异步任务结果
     *
     * @param future
     * @param timeout
     *            最大超时时间(单位毫秒), 超出则取消任务
     * @return
     */
    public static <T> T getFutureResult(Future<T> future, long timeout) {
        if (future == null) {
            return null;
        }
        T t = null;
        try {
            t = future.get(timeout, TimeUnit.MILLISECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            log.error(e.getMessage(), e);
            // cancel(false) 与 cancel(true）的区别在于，cancel(false) 只 取消已经提交但还没有被运行的任务（即任务就不会被安排运行）；而 cancel(true)
            // 会取消所有已经提交的任务，包括 正在等待的 和 正在运行的 任务。
            future.cancel(true);
        }
        return t;
    }

}
